#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <string.h>
#include <vector>
#include <sys/types.h>
#include <dirent.h>
#include <vector>
 #include <algorithm>
 #include  <cmath>
using namespace std;

void getFileFapiaoNum(vector<string>& filenames,vector<string>& filenamenums)
{
      	for (vector<string>::iterator it = filenames.begin(); it != filenames.end(); it++)
		// cout << *it<<endl;    //使用迭代器，正确
       {int num = count((*it).begin(),(*it).end(),'-');
        if (num>1)
            continue;

        int mypos =  (*it).find("-", 0);
        if( isdigit((*it)[mypos-1]) )
			filenamenums.push_back((*it).substr(3,mypos-3));
       }
}
 
void getFilesNames(string path, vector<string>& filenames)
{
	DIR *pDir;
    struct dirent* ptr;
    if(!(pDir = opendir(path.c_str()))){
        cout<<"Folder doesn't Exist!"<<endl;
        return;
    }
    while((ptr = readdir(pDir))!=0) {
        if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){
            filenames.push_back(path + "/" + ptr->d_name);
    	}
    }
    closedir(pDir);
}

void renameFiles(string path,vector<string>& fileNameNum)
{
		DIR *pDir;
    struct dirent* ptr;
    if(!(pDir = opendir(path.c_str()))){
        cout<<"Folder doesn't Exist!"<<endl;
        return;
    }
    while((ptr = readdir(pDir))!=0) {
        if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){
            // filenames.push_back(path + "/" + ptr->d_name);
			// cout<<"wenjian name =   "<<ptr->d_name<<endl;
           string tempStr = ptr->d_name;
		int num = count(tempStr.begin(),tempStr.end(),'-');
        if (num>1)
            continue;

        int mypos =  tempStr.find("-", 0);
        if( isdigit(tempStr[mypos-1]) )
		{
			string tempfileName = tempStr.substr(3,mypos-3);
			for (vector<string>::iterator it = fileNameNum.begin(); it != fileNameNum.end(); it++)
			{
				if((*it).find(tempfileName) != string::npos) 
						{
							ifstream fs;
							fs.open(tempStr.c_str());
							if (fs.fail())
							{
								cout << "文件打开失败！" << endl;
								fs.close();
							}
							else 
							{
								fs.close();
						 		if (rename(tempStr.c_str(), ((*it) + (tempStr.substr(mypos))).c_str()) == -1) // 文件重命名				
									{
									cout << "原来文件名：" << tempStr.c_str()<<endl;
									cout << "(*it):" << (*it).c_str()<<endl;
									cout << "tempStr.substr(mypos):" << tempStr.substr(mypos).c_str()<<endl;

									//cout << "新文件名：" <<((*it) + (tempStr.substr(mypos))).c_str()<< endl;
									cout << "文件名修改失败！" << endl;
									}
								}
							}
					// ptr->d_name = (*it);
			}
			// ptr->d_name = tempStr.substr(3,mypos-3)+"123";
		}
			
		
			// filenamenums.push_back((*it).substr(3,mypos-3));
       }
    }
    
    closedir(pDir);
}


void getCsvColls(string filename,vector<string>& fapiaoIDs, vector<string>& pingZhengIDs,vector<string>& faRenIDs, vector<string>&years)
{
	//读取文件中的数据
	ifstream ifs;							//创建流对象
 	ifs.open(filename, ios::in);	//打开文件
 	if (!ifs.is_open())						//判断文件是否打开
	{
		cout << "打开文件失败！！！";
	}
 
	vector<string> item;		//用于存放文件中的一行数据
 	string temp;				//临时存储文件中的一行数据
 	while (getline(ifs, temp))  //利用 getline（）读取文件中的每一行，并放入到 item 中
	{
		item.push_back(temp);
	}
    
    //遍历文件中的每一行数据
	for (auto it = item.begin(); it != item.end(); it++)
	{
		string str;
 		//其作用是把字符串分解为单词(在此处就是把一行数据分为单个数据)
		istringstream istr(*it);                 
 		//将字符串流 istr 中的字符读入到 str 字符串中，读取方式是以逗号为分隔符 
		getline(istr, str, ',');                  // str 对应第一列数据
   
		getline(istr, str, ',');                  // str 对应第二列数据 
 
		getline(istr, str, ',');                // str 对应第三列数据            
 
		getline(istr, str, ',');             // str 对应第四列数据    
    	fapiaoIDs.push_back(str);
		getline(istr, str, ',');                  // str 对应第五列数据    
 
		getline(istr, str, ',');                 // str 对应第六列数据   

        getline(istr, str, ',');                  // str 对应第七列数据   
 
		getline(istr, str, ',');                 // str 对应第八列数据         

		// getline(istr, str, ',');          

        getline(istr, str, ',');                // str 对应第九列数据   
        pingZhengIDs.push_back(str);
		getline(istr, str, ',');                 // str 对应第十列数据      

        getline(istr, str, ',');           // str 对应第十一列数据          
 		faRenIDs.push_back(str);
		getline(istr, str, ',');                // str 对应第十二列数据    
		years.push_back(str);
		getline(istr, str, ',');                // str 对应第十三列数据  
 
	}    
 
}

void nameCompare(vector<string>& fileNameNum,vector<string>& fapiaoIDs,vector<string>& pingZhengIDs, vector<string>& faRenIDs, vector<string>& years)
 {
  	for (vector<string>::iterator it = fileNameNum.begin(); it != fileNameNum.end(); it++)
  			for (int m=0;m<fapiaoIDs.size(); m++)
				if(*it == fapiaoIDs[m])
					{
						// cout<<"before"<<*it<<endl;
						*it =  faRenIDs[m]+years[m] +pingZhengIDs[m]+"-"+*it;
						// cout<<"after"<<*it<<endl;
					}	                
 }
int main()
{
	//get dir files names
    vector<string> fileNames,fileNameNum;
	getFilesNames("./",fileNames);
    getFileFapiaoNum(fileNames,fileNameNum);

	//get csv file coll datas
	 vector<string> fapiaoIDs,pingZhengIDs,faRenIDs,years,totalName;
	
	getCsvColls("../fs.csv",fapiaoIDs,pingZhengIDs,faRenIDs,years);

	nameCompare(fileNameNum,fapiaoIDs,pingZhengIDs,faRenIDs,years);

	renameFiles("./",fileNameNum);

  	// for (vector<string>::iterator it = fileNameNum.begin(); it != fileNameNum.end(); it++)
	// 	cout << *it<<endl;    //使用迭代器，正确
	// system("pause");
	return 0;
}